home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / util / moni / Scout-src.lha / source / objects / scout_flags.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-09-17  |  6.9 KB  |  219 lines

  1. /**
  2.  * Scout - The Amiga System Monitor
  3.  *
  4.  *------------------------------------------------------------------
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  * You must not use this source code to gain profit of any kind!
  21.  *
  22.  *------------------------------------------------------------------
  23.  *
  24.  * @author Andreas Gelhausen
  25.  * @author Richard Körber <rkoerber@gmx.de>
  26.  */
  27.  
  28. #include "system_headers.h"
  29.  
  30. struct MUIP_FlagsWin_ShowFlagsMessage {
  31.     ULONG MethodID;
  32.     ULONG value;
  33.     ULONG type;
  34.     void *bitarray;
  35.     void *maskarray;
  36.     UBYTE *title;
  37. };
  38.  
  39. struct FlagsEntry {
  40.     UBYTE fe_Name[64];
  41.     UBYTE fe_Value[32];
  42. };
  43.  
  44. static __asm __saveds LONG flaglist_con2func(register __a2 Object *obj, register __a1 struct NList_ConstructMessage *msg, register __a0 struct Hook *hook)
  45. {
  46.     return AllocListEntry(msg->pool, msg->entry, sizeof(struct FlagsEntry));
  47. }
  48.  
  49. MakeHook(flaglist_con2hook, flaglist_con2func);
  50.  
  51. static __asm __saveds LONG flaglist_des2func(register __a2 Object *obj, register __a1 struct NList_DestructMessage *msg, register __a0 struct Hook *hook)
  52. {
  53.     FreeListEntry(msg->pool, &msg->entry);
  54.  
  55.     return 0;
  56. }
  57.  
  58. MakeHook(flaglist_des2hook, flaglist_des2func);
  59.  
  60. static __asm __saveds LONG flaglist_dsp2func(register __a2 Object *obj, register __a1 struct NList_DisplayMessage *msg, register __a0 struct Hook *hook)
  61. {
  62.     struct FlagsEntry *fe = (struct FlagsEntry *)msg->entry;
  63.  
  64.     if (fe) {
  65.         msg->strings[0] = fe->fe_Name;
  66.         msg->strings[1] = fe->fe_Value;
  67.     } else {
  68.         msg->strings[0] = "Name";
  69.         msg->strings[1] = "Value";
  70.         msg->preparses[0] = MUIX_B;
  71.         msg->preparses[1] = MUIX_B;
  72.     }
  73.  
  74.     return 0;
  75. }
  76.  
  77. MakeHook(flaglist_dsp2hook, flaglist_dsp2func);
  78.  
  79. static __asm __saveds LONG flaglist_cmp2func(register __a2 Object *obj, register __a1 struct NList_CompareMessage *msg, register __a0 struct Hook *hook)
  80. {
  81.     struct FlagsEntry *fe1, *fe2;
  82.  
  83.     fe1 = (struct FlagsEntry *)msg->entry1;
  84.     fe2 = (struct FlagsEntry *)msg->entry2;
  85.  
  86.     return stricmp(fe1->fe_Value, fe2->fe_Value);
  87. }
  88.  
  89. MakeHook(flaglist_cmp2hook, flaglist_cmp2func);
  90.  
  91. static ULONG __saveds mNew( struct IClass *cl,
  92.                             Object *obj,
  93.                             struct opSet *msg )
  94. {
  95.     APTR flagtext, flaglist;
  96.  
  97.     if (obj = (Object *)DoSuperNew(cl, obj,
  98.         MUIA_Window_ID, MakeID('F','L','A','G'),
  99.         WindowContents, VGroup,
  100.             Child, HGroup,
  101.                 Child, HSpace(0),
  102.                 Child, flagtext = MyLabel2(""),
  103.                 Child, HSpace(0),
  104.             End,
  105.             Child, flaglist = MyNListviewObject(MakeID('F','L','L','V'), "BAR,BAR", &flaglist_con2hook, &flaglist_des2hook, &flaglist_dsp2hook, &flaglist_cmp2hook, FALSE),
  106.         End,
  107.         TAG_MORE, msg->ops_AttrList))
  108.     {
  109.         struct FlagsWinData *fwd = INST_DATA(cl, obj);
  110.         APTR parent;
  111.  
  112.         fwd->fwd_FlagsText = flagtext;
  113.         fwd->fwd_FlagsList = flaglist;
  114.  
  115.         set(obj, MUIA_Window_ActiveObject, flaglist);
  116.  
  117.         parent = (APTR)GetTagData(MUIA_Window_ParentWindow, (ULONG)NULL, msg->ops_AttrList);
  118.  
  119.         DoMethod(parent,   MUIM_Window_AddChildWindow, obj);
  120.         DoMethod(obj,      MUIM_Notify,              MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 5, MUIM_Application_PushMethod, parent, 2, MUIM_Window_RemChildWindow, obj);
  121.     }
  122.  
  123.     return (ULONG)obj;
  124. }
  125.  
  126. static ULONG __saveds mDispose( struct IClass *cl,
  127.                                 Object *obj,
  128.                                 struct opSet *msg )
  129. {
  130.     struct FlagsWinData *fwd = INST_DATA(cl, obj);
  131.  
  132.     set(obj, MUIA_Window_Open, FALSE);
  133.     DoMethod(fwd->fwd_FlagsList, MUIM_NList_Clear);
  134.  
  135.     return (DoSuperMethodA(cl, obj, msg));
  136. }
  137.  
  138. static ULONG __saveds mShowFlags( struct IClass *cl,
  139.                                   Object *obj,
  140.                                   Msg msg )
  141. {
  142.     struct FlagsEntry *fe;
  143.  
  144.     if (fe = tbAllocVecPooled(globalPool, sizeof(struct FlagsEntry))) {
  145.         struct FlagsWinData *fwd = INST_DATA(cl, obj);
  146.         struct MUIP_FlagsWin_ShowFlagsMessage *sfm = (struct MUIP_FlagsWin_ShowFlagsMessage *)msg;
  147.         UBYTE binflags[16];
  148.  
  149.         switch (sfm->type) {
  150.             case MUIV_FlagsWin_FlagsType_Byte:
  151.                 Flags2BinStr(sfm->value, binflags, sizeof(binflags));
  152.                 MySetContents(fwd->fwd_FlagsText, "%s = %s", sfm->title, binflags);
  153.                 break;
  154.  
  155.             case MUIV_FlagsWin_FlagsType_Word:
  156.                 MySetContents(fwd->fwd_FlagsText, "%s = $%04lx", sfm->title, sfm->value);
  157.                 break;
  158.  
  159.             case MUIV_FlagsWin_FlagsType_Long:
  160.             default:
  161.                 MySetContents(fwd->fwd_FlagsText, "%s = $%08lx", sfm->title, sfm->value);
  162.                 break;
  163.         }
  164.  
  165.         if (sfm->bitarray) {
  166.             struct LongFlag *lf = (struct LongFlag *)sfm->bitarray;
  167.             ULONG i;
  168.  
  169.             i = 0;
  170.             while (lf[i].lf_Name) {
  171.                 if (sfm->value & lf[i].lf_Value) {
  172.  
  173.                     stccpy(fe->fe_Name, lf[i].lf_Name, sizeof(fe->fe_Name));
  174.                     stccpy(fe->fe_Value, lf[i].lf_Text, sizeof(fe->fe_Value));
  175.  
  176.                     InsertSortedEntry(fwd->fwd_FlagsList, fe);
  177.                 }
  178.                 i++;
  179.             }
  180.         }
  181.         if (sfm->maskarray) {
  182.             struct MaskedLongFlag *mlf = (struct MaskedLongFlag *)sfm->maskarray;
  183.             ULONG i;
  184.  
  185.             i = 0;
  186.             while (mlf[i].mlf_Name) {
  187.                 if ((sfm->value & mlf[i].mlf_Mask) == mlf[i].mlf_Value) {
  188.  
  189.                     stccpy(fe->fe_Name, mlf[i].mlf_Name, sizeof(fe->fe_Name));
  190.                     stccpy(fe->fe_Value, mlf[i].mlf_Text, sizeof(fe->fe_Value));
  191.  
  192.                     InsertSortedEntry(fwd->fwd_FlagsList, fe);
  193.                 }
  194.                 i++;
  195.             }
  196.         }
  197.  
  198.         tbFreeVecPooled(globalPool, fe);
  199.     }
  200.  
  201.     set(obj, MUIA_Window_Open, TRUE);
  202.  
  203.     return 0;
  204. }
  205.  
  206. ULONG __asm __saveds FlagsWinDispatcher( register __a0 struct IClass *cl,
  207.                                          register __a2 Object *obj,
  208.                                          register __a1 Msg msg )
  209. {
  210.     switch (msg->MethodID) {
  211.         case OM_NEW:                  return (mNew(cl, obj, (APTR)msg));
  212.         case OM_DISPOSE:              return (mDispose(cl, obj, (APTR)msg));
  213.         case MUIM_FlagsWin_ShowFlags: return (mShowFlags(cl, obj, (APTR)msg));
  214.     }
  215.  
  216.     return (DoSuperMethodA(cl, obj, msg));
  217. }
  218.  
  219.